fn main() {

    // String类型在堆上分配的，因此可以被修改，并在运行时根据需要增加长度

    // 创建String类型的四种方法
    let a: String = "Hello".to_string();    // ToString特征
    let b = String::from("Hello"); // String的关联方法
    let c = "World".to_owned();      // ToOwned特征
    let d = c.clone();               // 开销昂贵，涉及到迭代来复制底层字节

    // String在标准库中的很多便捷方法
    let _ = String::new();                       // 分配空的String类型
    let _ = String::from("");                  // 分配新的String类型，并通过字符串切片填充它
    let _ = String::with_capacity(100);  // 分配一个预定义大小、空的String类型
    let _ = String::from_utf8(vec![]);       // 尝试从bytestring分配一个新的String类型。参数内容必须是UTF-8，否则将会失败。返回Result的包装器类型
    let _ = a.len();                             // 字符串实例的len方法，返回长度，兼容Unicode格式

    let mut s = "".to_string();
    let _ = s.push('a');                     // 添加字符
    let _ = s.push_str("a");               // 添加字符串切片
}